/*******************************************************************************
 * @brief: 请填写简??
 * @Author:   aple
 * @Date: 2022-12-06 20:24:33
 * @LastEditors: aple
 * @LastEditTime: 2022-12-07 09:26:27
 * @Verision: 1.0.0.0
 ******************************************************************************/

#ifndef __SYSTASK_H
#define __SYSTASK_H

#include <stdint.h>
#include "dataproc.h"
#include "rtctime.h"
#include "app_cfg.h"
#include "app_types.h"
#include "iohandle.h"

#ifdef __cplusplus
extern "C"
{
#endif

	/*****************************************************************************
	 * @brief   命令 .
	 *****************************************************************************/
	typedef struct
	{
		int8_t humi_tune_req; // 1启动，-1取消
		int8_t co2_tune_req;  // 1启动，-1取消
		int8_t nor_beep_req;
	} sys_req_type;

	/*****************************************************************************
	 * @brief   RTC .
	 *****************************************************************************/
	typedef struct
	{
		volatile uint32_t utick;
		sig_time_type rtc_s;
		micro_time_type rtc_m;
		char rtc_ok;
		TIME_Type sim_rtc;
		uint16_t voltage; // mV
		int16_t temperature;
		int16_t ac_freq;
	} sys_hal_type;

	/*****************************************************************************
	 * @brief   信息 .
	 *****************************************************************************/
	typedef struct
	{
		const char *compile_time;
	} sys_info_type;

	/*****************************************************************************
	 * @brief   杂项 .
	 *****************************************************************************/
	typedef struct
	{
		uu32 dev_run_time_total;
		uu08 backup_at_poweron_req;
		uu32 sys_max_tick;
		uu16 sys_max_us;
		uu16 alm_time_cnt;
		uu16 test_val;
	} sys_mix_type;

	/*****************************************************************************
	 * @brief   运行状态 .
	 *****************************************************************************/
	typedef union
	{
		uu08 mix;
		struct
		{
			uu8 box : 1;		   // 箱体控制
			uu8 motor : 1;		   // 电机控制
			uu8 motor_suspend : 1; // 电机暂停
			uu8 global : 1;		   // 全局 box | motor
			uu8 warm : 1;		   // 保温状态
			uu8 sterilize : 1;	   // 灭菌，与global及其它状态互斥
		};
	} box_run_st_type;


	/*****************************************************************************
	 * @brief   系统管理.
	 *****************************************************************************/
	typedef struct
	{
		box_run_st_type run_st;

		sys_info_type info;
		dev_fun_type dev_fun;
		sys_hal_type hal;
		sys_req_type req;

		sys_mix_type mix;

		uu8 err_beep_clr;

		io_flt_edge_type key;
		
		// 系统状态统计
		sys_bst_type bst;	 // 运行状态
		sys_out_st_type ost; // 输出状态
		sys_in_st_type ist;	 // 输入状态

		struct
		{
			uu8 nor_id[4];
			uu8 nor_sr[4];
		} flash;
	} sys_run_st_type;

	extern sys_run_st_type Gst;
	extern err_text_type app_err_code_tab[64];
	extern err_text_type hal_err_code_tab[64];
	
	/*****************************************************************************
	 * @brief   remote api.
	 *****************************************************************************/
	void remote_dat_update(void);

	/*****************************************************************************
	 * @brief   系统管理
	 *****************************************************************************/
	void sys_run_set(uu08 val);
	uu08 sys_run_get(void);

	void sys_box_run_set(uu08 val);
	uu08 sys_box_run_get(void);

	void sys_mot_run_set(uu08 val);
	uu08 sys_mot_run_get(void);

	void sys_mot_suspend_set(uu08 val);
	uu08 sys_mot_suspend_get(void);

	void sys_warm_set(uu08 val);
	uu08 sys_warm_get(void);

	void sys_sterilize_set(uu08 val);
	uu08 sys_sterilize_get(void);

	void sys_beep_clr_set(uu08 val);
	uu08 sys_beep_clr_get(void);

	void sys_temp_tune_set(uu08 val);
	uu08 sys_temp_tune_get(void);

	void sys_humi_tune_set(uu08 val);
	uu08 sys_humi_tune_get(void);

	void sys_co2_tune_set(uu08 val);
	uu08 sys_co2_tune_get(void);

	void sys_o3_tune_set(uu08 val);
	uu08 sys_o3_tune_get(void);

	void sterilize_run_time_handle(void);

#ifdef __cplusplus
}
#endif

#endif /* __SYSTASK_H */
